var _ = require('./utility');
/*
* Notifier - the internal object responsible for delegating between the client exposed API, the
* chain of transforms necessary to turn an item into something that can be sent to Rollbar, and the
* queue which handles the communcation with the Rollbar API servers.
*
* @param queue - an object that conforms to the interface: addItem(item, callback)
* @param options - an object representing the options to be set for this notifier, this should have
* any defaults already set by the caller
*/
function Notifier(queue, options) {
this.queue = queue;
this.options = options;
this.transforms = [];
}
/*
* configure - updates the options for this notifier with the passed in object
*
* @param options - an object which gets merged with the current options set on this notifier
* @returns this
*/
Notifier.prototype.configure = function(options) {
this.queue && this.queue.configure(options);
var oldOptions = this.options;
this.options = _.extend(true, {}, oldOptions, options);
return this;
};
/*
* addTransform - adds a transform onto the end of the queue of transforms for this notifier
*
* @param transform - a function which takes three arguments:
* * item: An Object representing the data to eventually be sent to Rollbar
* * options: The current value of the options for this notifier
* * callback: function(err: (Null|Error), item: (Null|Object)) the transform must call this
* callback with a null value for error if it wants the processing chain to continue, otherwise
* with an error to terminate the processing. The item should be the updated item after this
* transform is finished modifying it.
*/
Notifier.prototype.addTransform = function(transform) {
if (_.isFunction(transform)) {
this.transforms.push(transform);
}
return this;
};
/*
* log - the internal log function which applies the configured transforms and then pushes onto the
* queue to be sent to the backend.
*
* @param item - An object with the following structure:
* message [String] - An optional string to be sent to rollbar
* error [Error] - An optional error
*
* @param callback - A function of type function(err, resp) which will be called with exactly one
* null argument and one non-null argument. The callback will be called once, either during the
* transform stage if an error occurs inside a transform, or in response to the communication with
* the backend. The second argument will be the response from the backend in case of success.
*/
Notifier.prototype.log = function(item, callback) {
if (!callback || !_.isFunction(callback)) {
callback = function() {};
}
if (!this.options.enabled) {
return callback(new Error('Rollbar is not enabled'));
}
var originalError = item.err;
this._applyTransforms(item, function(err, i) {
if (err) {
return callback(err, null);
}
this.queue.addItem(i, callback, originalError);
}.bind(this));
};
/* Internal */
/*
* _applyTransforms - Applies the transforms that have been added to this notifier sequentially. See
* `addTransform` for more information.
*
* @param item - An item to be transformed
* @param callback - A function of type function(err, item) which will be called with a non-null
* error and a null item in the case of a transform failure, or a null error and non-null item after
* all transforms have been applied.
*/
Notifier.prototype._applyTransforms = function(item, callback) {
var transformIndex = -1;
var transformsLength = this.transforms.length;
var transforms = this.transforms;
var options = this.options;
var cb = function(err, i) {
if (err) {
callback(err, null);
return;
}
transformIndex++;
if (transformIndex === transformsLength) {
callback(null, i);
return;
}
transforms[transformIndex](i, options, cb);
};
cb(null, item);
};
module.exports = Notifier;
|